/*
 * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。
 * 
 * 欢迎到知启蒙网站（https://www.zhiqim.com）购买正版软件，知启蒙还提供许多开源框架和软件。
 * 
 * 1、本软件产品所有源代码受《中华人民共和国著作权法》和其他有关法律、法规的保护，其所有知识产权归湖南知启蒙科技有限公司所有；
 * 2、禁止复制和修改。不得复制修改、翻译或改编本软件所有源代码，或者基于本软件产品创作衍生作品；
 * 3、禁止进行逆向工程。不得对本软件的源代码进行逆向工程、反编译或试图以其他方式发现软件的源代码；
 * 4、个别授权：如需进行商业性的销售、复制、分发，包括但不限于软件销售、预装、捆绑等，必须获得知启蒙的书面授权和许可；
 * 5、保留权利：本注释未明示授权的其他一切权利仍归知启蒙所有，任何人使用其他权利时必须获得知启蒙的书面同意。
*/
package net.redxyz.repost.service.task.tmc;

import org.zhiqim.kernel.json.Jsons;
import org.zhiqim.kernel.logging.Log;
import org.zhiqim.kernel.logging.LogFactory;
import org.zhiqim.kernel.paging.PageResult;
import org.zhiqim.kernel.schedule.Task;
import org.zhiqim.kernel.util.DateTimes;
import org.zhiqim.kernel.util.Strings;

import net.redxyz.repost.service.Constants;
import net.redxyz.repost.service.dao.TmcDao;
import net.redxyz.repost.service.dao.UserDao;
import net.redxyz.top.dbo.tmc.TmcMessage;
import net.redxyz.top.dbo.user.UserOrder;

/**
 * 处理TMC服务类消息，目前只有订购消息
 * 
 * 字段名称             字段描述    字段类别    字段类型    是否可空    示例值     其它信息
 * activity_code        活动代码，从合作伙伴后台（i.fuwu.taobao.com）-收费管理-营销活动列表 能够获得该活动的代码  基本类型    String  是   ACT_1234    
 * article_code         应用收费代码，从合作伙伴后台（my.open.taobao.com）-收费管理-收费项目列表 能够获得该应用的收费代码     基本类型    String  否   ts-123  
 * article_name         应用名称    基本类型    String  否   网店版     
 * biz_order_id         订单号     基本类型    Number  否   123456  
 * biz_type             订单类型，1=新订 2=续订 3=升级 4=后台赠送 5=后台自动续订 6=订单审核后生成订购关系（暂时用不到）    基本类型    Number  否   1   
 * create               订单创建时间（订购时间）    基本类型    Date    否   2015-03-12 16:24:09     
 * fee                  原价（单位为分）    基本类型    String  否   123     
 * item_code            收费项目代码，从合作伙伴后台（my.open.taobao.com）-收费管理-收费项目列表 能够获得收费项目代码   基本类型    String  否   ts-123-1    
 * item_name            收费项目名称  基本类型    String  否   批量推荐    
 * nick                 用户昵称    基本类型    String  否   taobao  
 * order_cycle          订购周期 1表示年 ，2表示月，3表示天。   基本类型    String  否   1   
 * order_cycle_end      订购周期结束时间    基本类型    Date    否   2015-03-12 16:22:44     
 * order_cycle_start    订购周期开始时间    基本类型    Date    否   2015-03-12 16:22:40     
 * order_id             子订单号    基本类型    Number  否   7000011     
 * order_status         订单状态, 1=订单合法，2=订单非法,3=订单完成，4=订单确认   基本类型    Number  否   1   
 * outer_trade_code     外部交易号   基本类型    String  是   210736231   
 * pay_status           付款状态：0-未付款，1-已付款    基本类型    Number  是   0   
 * prom_fee             优惠（单位为分）    基本类型    String  否   123     
 * refund_fee           退款（单位为分；升级时，系统会将升级前老版本按照剩余订购天数退还剩余金额）   基本类型    String  否   123     
 * total_pay_fee        实付（单位为分）    基本类型    String  否   123     
 * version_no           收费项目的版本序号   基本类型    Number  是   1 
 * fwconfirm_type       内购确认状态     基本类型   String   否   fuwu_confirm_Success
 *
 * @version v1.0.0 @author zouzhigang 2014-3-21 新建与整理
 */
public class TmcFuwuTask implements Task, Constants
{
    private static final Log log = LogFactory.getLog(TmcFuwuTask.class);
    private static final String NAME = "[TMC服务]";
    
    public void execute()
    {
        log.info(NAME + "开始...");
        
        while(true)
        {        
            PageResult<TmcMessage> result = TmcDao.page(TMC_FUWU.value(), NAME);
            if (result == null)
            {//数据库异常
                return;
            }
            
            if (result.total() == 0)
            {//没有新的消息
                log.info(NAME + "结束，没有新的消息，等待下次查询");
                return;
            }
                
            log.info(NAME + "查询到["+result.total()+"]消息，本次["+result.size()+"]个");
                
            for (TmcMessage message : result.list())
            {//逐个消息处理
                if(!"taobao_fuwu_OrderPaid".equals(message.getTopic()))
                {//非订购消息不处理
                    log.info(NAME + "不是订购支付消息["+message.getTopic()+"]");
                    TmcDao.delete(message.getId(), TMC_FUWU);
                    return;
                }
                
                process(message);
            }
            
            if (result.size() == result.total())
            {//全部查出的结束
                log.info(NAME + "结束...");
                break;
            }
        }
    }
    
    /** 逐个消息处理 */
    private void process(TmcMessage message)
    {
        String content = message.getContent();
        String nick = Jsons.getString(content, "nick");
        
        try
        {
            //1.计算订购周期
            String beginTime = Jsons.getString(content, "order_cycle_start");
            String endTime = Jsons.getString(content, "order_cycle_end");
            
            String beginDate = beginTime.substring(0, 10);
            String endDate = endTime.substring(0, 10);
            
            String orderCycle = "";
            int months = compareMonth(endDate, beginDate);
            if (months > 0)
            {
                orderCycle += months + "个月";
                beginDate = DateTimes.getNextDateStringByMonth(beginDate, months);
            }
            
            int days = DateTimes.compareDay(endDate, beginDate);
            if(days > 0)
            {
                orderCycle += days + "天";
            }

            //2.把订购消息转换成UserOrder
            UserOrder order = new UserOrder();
            order.setNick(nick);
            order.setOrderCycle(orderCycle);
            order.setBeginTime(beginTime);
            order.setEndTime(endTime);
            order.setBizOrderId(Jsons.getLong(content, "biz_order_id"));
            order.setBizType(Jsons.getInt(content, "biz_type"));
            order.setFee(Jsons.getString(content, "fee"));
            order.setOrderId(Jsons.getLong(content, "order_id"));
            order.setOrderTime(Jsons.getString(content, "create"));
            order.setPromFee(Strings.removeEndsWith(Jsons.getString(content, "prom_fee"), ".0"));
            order.setRefundFee(Strings.removeEndsWith(Jsons.getString(content, "refund_fee"), ".0"));
            order.setTotalPayFee(Strings.removeEndsWith(Jsons.getString(content, "total_pay_fee"), ".0"));
            
            order.setVersionNo(Jsons.getInt(content, "version_no"));
            order.setItemCode(Jsons.getString(content, "item_code"));
            order.setActivityCode(Jsons.getString(content, "activity_code"));
            
            //3.处理订购消息
            UserDao.doUpdateOrder(order);
            log.info(NAME + "用户["+nick+"]订购成功");
        }
        catch (Exception e)
        {
            log.error(NAME + "用户["+nick+"]处理异常", e);
        }
        finally
        {//每条消息只处理一次
            TmcDao.delete(message.getId(), TMC_FUWU);
        }
    }
    
    /**
     * 获取两个日期对象相差月数,大一整月才算大一个月
     * 
     * @param date1 字符串对象
     * @param date2 字符串对象
     * @return int 月份差值
     */
    public static int compareMonth(String date1, String date2)
    {
        if (date1 == null || date2 == null)
            return 0;
        
        int year1 = Integer.parseInt(date1.substring(0, 4));
        int year2 = Integer.parseInt(date2.substring(0, 4));
        int month1 = Integer.parseInt(date1.substring(5, 7));
        int month2 = Integer.parseInt(date2.substring(5, 7));
        int day1 = Integer.parseInt(date1.substring(8, 10));
        int day2 = Integer.parseInt(date2.substring(8, 10));
        
        int value = (year1 - year2) * 12 + (month1 - month2);
        if (day1 < day2)
            value--;

        return value;
    }
}
